﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

using Telerik.WinControls;

using Library.Data.Security.Encryption;

namespace UnigenReport
{
    public partial class fLogin : Telerik.WinControls.UI.RadForm
    {
        private UnigenDataContext db = new UnigenDataContext();
        XmlDocument xmlDoc = new XmlDocument();

        #region Thiết lập
        
        public fLogin()
        {
            InitializeComponent();

            SetEvent();
            SetDefault();

            if (String.IsNullOrEmpty(txtUserName.Text.Trim()))
                txtUserName.Focus();
            else if (String.IsNullOrEmpty(txtPassword.Text.Trim()))
                txtPassword.Focus();
            else
                btnLogin.Focus();
        }

        /// <summary>
        /// Khai báo các sự kiện
        /// </summary>
        private void SetEvent()
        {
            KeyDown += fLogin_KeyDown;
            btnLogin.Click += btnLogin_Click;
            this.lblConfig.Click += new System.EventHandler(this.lblConfig_Click);
        }

        /// <summary>
        /// Thiết lập các giá trị mặc định của form
        /// </summary>
        private void SetDefault()
        {
            try
            {
                LoadConfig();
                lblServer.Text = Properties.Settings.Default.UnigenConnectionString1.Split(';')[0];
            }
            catch (Exception ex)
            {
                Common.ShowErrorMess("#SetDefault:\n" + ex.Message);
            }
        }

        #endregion

        #region Hàm
        
        /// <summary>
        /// Nạp thông số cấu hình
        /// </summary>
        public void LoadConfig()
        {
            try
            {
                //Lấy thông tin từ tệp cấu hình
                var login = new SystemConfig.Login();
                chkRemember.Checked = login.IsRemember;
                if (chkRemember.Checked)
                {
                    txtUserName.Text = login.User.UserName;
                    txtPassword.Text = MD5Encryptor.Decrypt(login.User.UserName.ToUpper(), login.User.Password);
                }
            }
            catch (Exception ex)
            { 
                /**/
            }
        }

        /// <summary>
        /// Lưu thông số cấu hình
        /// </summary>
        public void SaveConfig()
        {
            try
            {
                //Lưu lại thông tin acc vào file cấu hình
                var login = new SystemConfig.Login();
                login.IsRemember = chkRemember.Checked;

                if (chkRemember.Checked)
                {
                    login.User = new SystemConfig.Login.UserInfo()
                    {
                        UserName = txtUserName.Text.Trim(),
                        Password = MD5Encryptor.Encrypt(txtUserName.Text.Trim().ToUpper() ,txtPassword.Text.Trim())
                    };
                }
            }
            catch (Exception ex)
            {
                /**/
            }
            finally
            {
                SystemConfig.Save();
            }
        }
        
        /// <summary>
        /// Đăng nhập
        /// </summary>
        private void SignIn()
        {
            var userName = txtUserName.Text.Trim();
            var password = txtPassword.Text.Trim();

            //Check valid
            if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password))
            {
                Common.ShowNoticeMess("Thiếu thông tin đăng nhập");
                return;
            }

            //Đăng nhập
            AuthenticateAccount(userName, password);
        }

        /// <summary>
        /// Kiểm tra thông tin
        /// </summary>
        private void AuthenticateAccount(string userName, string password)
        {
            try
            {
                var encodeInput = MD5Encryptor.Encrypt(userName.ToUpper(), password);
                var acc = db.Users.SingleOrDefault(p => p.UserName == userName && p.Password == encodeInput);
                if (acc == null)
                {
                    Common.ShowErrorMess("Đăng nhập thất bại!");
                }
                else
                {
                    //Lấy các thông tin tài khoản đưa vào biến toàn cục
                    Variables.UserID = acc.UserID;
                    Variables.UserName = acc.UserName;
                    Variables.Password = acc.Password;
                    Variables.FullName = acc.FullName;
                    Variables.UserType = acc.Type;
                    Variables.UserRoleID = acc.RoleID;

                    //Lưu cấu hình
                    SaveConfig();

                    //Đóng lại form
                    this.DialogResult = System.Windows.Forms.DialogResult.OK;
                }
            }
            catch (Exception ex)
            {
                Common.ShowErrorMess("AuthenticateAccount - " + ex.Message);
            }

        }

        #endregion

        #region Sự kiện

        private void btnLogin_Click(object sender, EventArgs e)
        {
            SignIn();
        }

        private void fLogin_KeyDown(object sender, KeyEventArgs e)
        {
            //Bắt phím Enter
            if(e.KeyCode == Keys.Enter)
                SignIn();
        }

        private void lblConfig_Click(object sender, EventArgs e)
        {
            var f = new fConfig() { Dock = DockStyle.Fill };
            f.StartPosition = FormStartPosition.CenterScreen;
            f.ShowDialog();
        }

        #endregion
    }
}
